package com.swak.validator.process;

import java.lang.annotation.Annotation;

import com.swak.asm.FieldCache.FieldMeta;
import com.swak.utils.StringUtils;

/**
 * 实现基本的处理器
 *
 * @author lifeng
 */
public abstract class AbstractProcessor implements Processor {

	/**
	 * 处理器
	 */
	private Processor processor;

	/**
	 * 匹配分组
	 * 
	 * @param groups
	 * @param group
	 * @return
	 */
	protected boolean matchGroup(String[] groups, String group) {
		if (groups == null || groups.length == 0) {
			return true;
		}
		if (StringUtils.isBlank(group)) {
			return false;
		}

		// 快捷匹配
		if (groups.length >= 1 && group.equals(groups[0])) {
			return true;
		}
		if (groups.length >= 2 && group.equals(groups[1])) {
			return true;
		}
		if (groups.length >= 3 && group.equals(groups[2])) {
			return true;
		}
		if (groups.length >= 4) {
			for (int i = 3; i < groups.length; i++) {
				if (group.equals(groups[i])) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 处理消息
	 */
	@Override
	public String process(FieldMeta field, Object value, String group) {

		// 处理结果
		Annotation checkAn;
		if ((checkAn = field.getAnnotation(this.processBy())) != null && !this.doProcess(checkAn, value, group)) {
			return this.processMessage(checkAn);
		}

		// 下一个处理器
		if (processor != null) {
			return processor.process(field, value, group);
		}

		// 返回结果
		return null;
	}

	/**
	 * 返回处理的类型
	 *
	 * @return 可以处理的类
	 */
	protected abstract Class<?> processBy();

	/**
	 * 子类需要实现如何处理
	 *
	 * @param check 注解
	 * @param value 默认值
	 * @return 处理结果
	 */
	protected abstract boolean doProcess(Annotation check, Object value, String group);

	/**
	 * 处理错误消息, 可以自定义错误消息
	 *
	 * @param ann 注解
	 * @return 错误消息
	 */
	protected abstract String processMessage(Annotation ann);

	/**
	 * 设置下一个处理器
	 */
	@Override
	public Processor next(Processor processor) {
		this.processor = processor;
		return processor;
	}
}
